package com.company.model;

import com.company.bean.UserInfoBean;
import com.company.dao.DBProvide;
import com.company.util.Myutils;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class UserModel {


    /**
     * 根据id删除用户信息【逻辑删除】
     * @param strUserID
     * @return
     */
    //逻辑删除：删除数据
    public  int LogicollyDeleteUserInfoById(String strUserID){
        //返回默认值0
        int i = 0;
        //逻辑删除=====sql语句
        String strSql =
                "UPDATE  userinfo set userinfoDeleted = 1 WHERE userID = ? ";
        //调用dba层进行数据库操作
        i = Myutils.getNewIntance(DBProvide.class).execute(strSql,strUserID);

        return i;
    }



    /**
     * 根据id删除用户信息【物理删除】
     * @param strUserID
     * @return
     */
    //物理删除：删除数据
    public  int deleteUserInfoById(String strUserID){
        //返回默认值0
        int i = 0;
        //物理删除=====sql语句
        String strSql = "DELETE FROM userinfo where userid =? ";
        //逻辑删除=====sql语句
        // String strSql = "";update
        //调用dba层进行数据库操作
        i = Myutils.getNewIntance(DBProvide.class).execute(strSql,strUserID);

        return i;
    }



    /**
     *sql语句
     * 根据ID查询用户信息数据
     *
     * @return 查询结果
     */
    public UserInfoBean queryUserInfoById(String strId) {
        UserInfoBean userInfoBean = null;
        //查询语句
        String strSql = "select * from userInfo where  userID = ?";
        userInfoBean = Myutils.getNewIntance(DBProvide.class).
                query(strSql,new BeanHandler<>(UserInfoBean.class),strId);
        return userInfoBean;
    }


    /**
     *按条件查询用户信息
     *
     * @return
     */
    public List<UserInfoBean> queryUserInfoByParams(UserInfoBean userInfoBean){
        List<UserInfoBean> list = new ArrayList<>();
        //查询语句--根据查询条件进行动态拼接

        //定义一个存储占位符参数的集合list
        List listParams = new ArrayList();

        /**
         *select * from userinfo WHERE userName like '%a%'
         * and userPhone LIKE '%1%' and userRegisterDate>='2021-04-01';
         */
        //StringBuilder sbSql = new StringBuilder(" select * from userinfo where 1=1 ");


        //逻辑删除下的查询数据
        StringBuilder sbSql = new StringBuilder
                (" select * from userinfo where userinfoDeleted = 0 ");

        if (userInfoBean != null){
            //动态拼接的sql语句

            //用户名
            if (userInfoBean.getUserName() !=null && !userInfoBean.getUserName().equals("")){
                sbSql.append(" and  userName like ?");
                //拼接占位符参数
                listParams.add("%"+userInfoBean.getUserName()+"%");//此时需要引入第三方的包到啊pom.xml中
            }
            // 联系电话查询
            //此时需要引入第三方的包到啊pom.xml中
            if (StringUtils.isNotEmpty(userInfoBean.getUserPhone())) {
                sbSql.append(" and userPhone LIKE ? ");
                // 拼接占位符参数
                listParams.add("%" + userInfoBean.getUserPhone() + "%");
            }

            // 开始日期查询
            if (userInfoBean.getUserRegisterDate() != null) {
                sbSql.append(" and userRegisterDate>= ? ");
                // 拼接占位符参数
                listParams.add(
                        DateFormatUtils.format
                        (userInfoBean.getUserRegisterDate(),"yyyy-MM-dd HH:mm:ss"));
            }
            // 结束日期查询
            if (userInfoBean.getUserRegisterDate2() != null) {
                sbSql.append(" and userRegisterDate<= ?");
                // 拼接占位符参数
                listParams.add(
                        DateFormatUtils.format
                        (userInfoBean.getUserRegisterDate2(),"yyyy-MM-dd HH:mm:ss"));
            }
        }

        //排序
        sbSql.append("order by userID desc");
        //查询操作
        list = Myutils.getNewIntance(DBProvide.class)
                .query(sbSql.toString(),new BeanListHandler<>(UserInfoBean.class),
                        listParams.toArray());

        return list;
    }

    /**
     *sql语句查询数据
     *
     * @return
     */
    public List<UserInfoBean> queryUserInfoAll(){
        List<UserInfoBean> list = new ArrayList<>();
        //查询语句
        String strSql = "select * from userInfo order by userID desc";
        list = Myutils.getNewIntance(DBProvide.class).
                query(strSql,new BeanListHandler<>(UserInfoBean.class));

        return list;
    }


    /**
     * sql语句插入数据
     * 数据库保存控制台插入的数据
     *
     * 用户值新增
     *
     * @param userInfoBean 参数实体类
     * @return 数据保存成功的记录
     */
    public int saveUserInfo(UserInfoBean userInfoBean){
        //默认返回值
        int i = 0 ;

        /**
         * 这个方法即处理新增业务逻辑，也可以处理修改业务逻辑
         * 新增和修改的区别
         * 新增参数实体bean userInfoBean  的主键字段的值 为null
         * 修改是参数实体bean userInfoBean 的主键字段的值 为null
         *
         */

        /* 按条件id的主键值查询，进行判断，
        主键值为空跳转到查询页面，不为空跳转到修改页面，
        修改成功后，将数据库的所有内容显示到前端控制台*/
        //主键字段不为null,进行修改操作
        if (userInfoBean.getUserID() != null){

            //数据保存的sql语句
            String strSql ="UPDATE userinfo SET userName = ?,userPsw =? , userPhone=? ," +
                    " userRegisterDate =? WHERE userID= ?";

            //调用数据库操作dao层进行数据库的保存处理
            i = Myutils.getNewIntance(DBProvide.class).execute(strSql,new Object[]{
                    userInfoBean.getUserName(),userInfoBean.getUserPsw(),
                    userInfoBean.getUserPhone(), userInfoBean.getUserRegisterDate(),
                    userInfoBean.getUserID()//日期转换成String的数据类型
            });

        } else {
            //主键字段为null ，进行新增操作

            //数据保存的sql语句
            String strSql = "INSERT INTO userinfo(userName,userPsw,userPhone,userRegisterDate) " +
                    "VALUES(?,?,?,?);";

            //调用数据库操作dao层进行数据库的保存处理
            i = Myutils.getNewIntance(DBProvide.class).execute(strSql,new Object[]{
                    userInfoBean.getUserName(),userInfoBean.getUserPsw(),
                    userInfoBean.getUserPhone(),
                    //不需要Myutils也可以保存
                    Myutils.convertDate2String(userInfoBean.getUserRegisterDate(), "yyyy-MM-dd HH:mm:ss") //日期转换成String的数据类型
            });

        }
        return  i ;
    }

    /**
     * 验证用户是否登录成功
     * @param userName
     * @param userPsw
     * @return
     */

    public boolean doLogin(String userName, String  userPsw){
        //默认返回值
        boolean canLogined = false;

        //验证是否有这个人，即从数据库中查询
        //查询sql语句
        String strSql =
                " SELECT * FROM userinfo WHERE userinfoDeleted = 0 and userName = ? AND userPsw = ?";

        //创建查询器的对象
        //DBProvider dbProvider = new DBProvider();
       // List<Map<String,Object>> list = dbProvider.queryListMap(strSql,userName,userPsw);

        List<Map<String,Object>> list = Myutils .getNewIntance(DBProvide.class).
                query(strSql,new MapListHandler(),userName,userPsw);

        //判断是否登录成功
        if (list!=null && list.size()>0){
            //登录成功
            canLogined = true;
        }
        //返回值
        return canLogined;
    }
}
